/**
 * 文件名：@AbstractRequestBodyArgumentResolver.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.springmvc <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.springmvc;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import cn.efunbox.afw.web.util.AfwWebConstant;

/**
 * 类名：AbstractRequestBodyArgumentResolver  <br />
 *
 * 功能：请求体参数解析基类
 *
 * @author xtwin <br />
 * 创建时间：2016年7月27日 下午4:32:39  <br />
 * @version 2016年7月27日
 */
public abstract class AbstractRequestBodyArgumentResolver<T> implements HandlerMethodArgumentResolver {

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月27日 下午4:32:54<br/>
	 * 
	 * @param parameter
	 * @param mavContainer
	 * @param webRequest
	 * @param binderFactory
	 * @return
	 * @throws Exception <br/>
	 * @see org.springframework.web.method.support.HandlerMethodArgumentResolver#resolveArgument(org.springframework.core.MethodParameter, org.springframework.web.method.support.ModelAndViewContainer, org.springframework.web.context.request.NativeWebRequest, org.springframework.web.bind.support.WebDataBinderFactory)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
		
		// 取出body对象
		T body = (T) webRequest.getAttribute(AfwWebConstant.KEY_REQUEST_BODY, RequestAttributes.SCOPE_REQUEST);
		
		if (null == body) {
			return null;
		}
		
		// 执行参数解析
		return doResolveArgument(body, parameter, mavContainer, webRequest, binderFactory);
	}
	
	/**
	 * 功能：从body对象中解析出参数 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年7月27日 下午4:34:47 <br/>
	 */
	protected abstract Object doResolveArgument(T body, MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory);
}